package com.sigmatrix.h5.utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Collection;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang.StringUtils;

/**
 * 
 *@ClassName: CommonUtils
 *@Description: 判断对象是否为空工具类
 *@author MH
 *@date 2017年9月22日 下午4:42:39
 */
public class CommonUtils {
	
	/**
	 * 
	 *@Title: isEmpty
	 *@Description: 判断某个对象是否为空支持 String、数组、集合、map以及对象
	 *@return boolean
	 *@author MH
	 *@date 2017年9月22日 下午5:02:04
	 *@param o
	 *@return
	 */
	@SuppressWarnings("rawtypes")
	public static boolean isEmpty(Object o){
		if(o == null) return true;
		//字符串
		if(o instanceof String){
			return StringUtils.isBlank((String)o);
		//数组
		}else if(o instanceof Object[]){
			Object[] _o  = null;
			for (int i = 0; i < (_o = (Object[])o).length; i++) {
				if(_o[i] != null && !"".equals(_o[i])){
					return false;
				}
			}
		//集合
		}else if(o instanceof Collection){
			Collection c = null;
			return (c=(Collection)o).isEmpty() || c.size() <= 0;
		//map
		}else if(o instanceof Map){
			return MapUtils.isEmpty((Map)o);
		}
		return false;
	}
	
	/**
	 * 
	 *@Title: isNotEmpty
	 *@Description: 返回 !isEmpty()
	 *@return boolean
	 *@author MH
	 *@date 2017年9月22日 下午5:04:01
	 *@param o
	 *@return
	 */
	public static  boolean isNotEmpty(Object o){
		return !isEmpty(o);
	}
	/**
	 * 
	 *@Title: camelhumpToUnderline
	 *@Description: 驼峰转下划线，根据我们的数据库字段特点，转换后的字符以下划线开头
	 *@return String
	 *@author MH
	 *@date 2017年8月4日 下午1:59:56
	 *@param str
	 *@return
	 */
	public static String camelhumpToUnderline(String str) {
        final int size;
        final char[] chars;
        final StringBuilder sb = new StringBuilder(
                (size = (chars = str.toCharArray()).length) * 3 / 2 + 1);
        char c;
        for (int i = 0; i < size; i++) {
            c = chars[i];
            if (isUppercaseAlpha(c)) {
                sb.append('_').append(toLowerAscii(c));
            } else {
                sb.append(c);
            }
        }
        return sb.charAt(0) == '_' ?  sb.toString() : "_"+sb.toString();
    }

    /**
     * 驼峰转下划线
     *@Title: underlineToCamelhump
     *@Description: 
     *@return String
     *@author MH
     *@date 2017年8月4日 下午2:08:36
     *@param str
     *@return
     */
    public static String underlineToCamelhump(String str) {
        Matcher matcher = Pattern.compile("_[a-z]").matcher(str);
        StringBuilder builder = new StringBuilder(str);
        for (int i = 0; matcher.find(); i++) {
            builder.replace(matcher.start() - i, matcher.end() - i, matcher.group().substring(1).toUpperCase());
        }
        if (Character.isUpperCase(builder.charAt(0))) {
            builder.replace(0, 1, String.valueOf(Character.toLowerCase(builder.charAt(0))));
        }
        return builder.toString();
    }

    public static boolean isUppercaseAlpha(char c) {
        return (c >= 'A') && (c <= 'Z');
    }

    public static boolean isLowercaseAlpha(char c) {
        return (c >= 'a') && (c <= 'z');
    }

    public static char toUpperAscii(char c) {
        if (isLowercaseAlpha(c)) {
            c -= (char) 0x20;
        }
        return c;
    }

    public static char toLowerAscii(char c) {
        if (isUppercaseAlpha(c)) {
            c += (char) 0x20;
        }
        return c;
    }
	
	/**
	 * 
	 *@Title: decodeSHA256
	 *@Description: sha256加密
	 *@return String
	 *@author MH
	 *@date 2017年10月10日 下午6:16:15
	 *@param src
	 *@return
	 */
	public static String encodeSHA256(String src){
		try {
			String ret = "";
			if(StringUtils.isNotBlank(src)) {
				MessageDigest digest = MessageDigest.getInstance("SHA-256");
			    byte[] hash = digest.digest(src.getBytes());
			    ret = Base64.encodeBase64URLSafeString(hash);
			}
			return ret;
		} catch (NoSuchAlgorithmException e) {
			throw new IllegalArgumentException("SHA-256加密失败",e);
		}
	}
	
	/**
	 * 
	 *@Title: decodeQRCode
	 *@Description: HTTP://TCC.SO/A/R*HF:2UAA1LW+Q.HGVCQL1?P=fl101
	 *@return String
	 *@author MH
	 *@date 2017年10月10日 下午6:18:00
	 *@param qrCode
	 *@return
	 */
	public static String encodeQRCode(String qrCode){
		if(StringUtils.isBlank(qrCode)) return null;
		int last = qrCode.indexOf("?");
		return encodeSHA256(qrCode.substring(qrCode.lastIndexOf("/")+1, last == -1?qrCode.length():last));
	}
	
	/**
	 * 
	 *@Title: isCellPhoneNumber
	 *@Description: 验证手机号
	 *@return boolean
	 *@author MH
	 *@date 2017年10月31日 上午11:19:54
	 *@param s
	 *@return
	 */
	public static boolean isCellPhoneNumber(String s){
		if(StringUtils.isBlank(s)) return false;
		return s.matches("^(\\+?86\\s*)?1\\d{10}$");
	}
	
	/**
	 * 
	 *@Title: isMail
	 *@Description: 判断是否是邮箱
	 *@return boolean
	 *@author MH
	 *@date 2017年10月31日 上午11:20:51
	 *@param s
	 *@return
	 */
	public static boolean isMail(String s){
		if(StringUtils.isBlank(s)) return false;
		return s.matches("^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\\.[a-zA-Z0-9_-]{2,3}){1,2})$");
	}
	/**
	 * 
	 *@Title: isNumber
	 *@Description:判断是否是数字包括整数跟浮点数 
	 *@return boolean
	 *@author MH
	 *@date 2017年11月14日 下午2:36:43
	 *@param s
	 *@return
	 */
	public static boolean isNumber(String s){
		if(StringUtils.isBlank(s)) return false;
		return s.matches("^\\d{1,}(\\.\\d{1,})?$");
	}
	
	/**
	 * 
	 *@Title: isInteger
	 *@Description: 判断是否是整数
	 *@return boolean
	 *@author MH
	 *@date 2017年11月14日 下午2:37:30
	 *@param s
	 *@return
	 */
	public static boolean isInteger(String s){
		if(StringUtils.isBlank(s)) return false;
		return s.matches("^\\d{1,}$");
	}
	public static void main(String[] args) {
		System.out.println(encodeQRCode("HTTP://SS.SAO.SO/Q/PGBCL1JUT7-GIYEVKB:"));
	}
}
